home *** CD-ROM | disk | FTP | other *** search
- /*----------------------------------------------------------------------*/
- /* LHarc List Command */
- /* This is part of LHarc UNIX Archiver Driver */
- /* */
- /* Copyright(C) MCMLXXXIX Yooichi.Tagawa */
- /* */
- /* V0.00 Original 1988.05.23 Y.Tagawa */
- /* V1.00 Fixed 1989.09.22 Y.Tagawa */
- /* V1.01 Bug Fix for month name 1989.12.25 Y.Tagawa */
- /*----------------------------------------------------------------------*/
-
- #include "lharc.h"
-
- static long packed_size_total;
- static long original_size_total;
- static int list_files;
-
- /*----------------------------------------------------------------------*/
- /* Print Stuff */
- /*----------------------------------------------------------------------*/
-
- /* need 14 or 22 (when verbose_listing is TRUE) column spaces */
- static void
- print_size (packed_size, original_size)
- long packed_size, original_size;
- {
- if (verbose_listing)
- printf ("%7d ", packed_size);
-
- printf ("%7d ", original_size);
-
- if (original_size == 0L)
- printf ("******");
- else
- printf ("%3d.%1d%%",
- (int)((packed_size * 100L) / original_size),
- (int)((packed_size * 1000L) / original_size) % 10);
- }
-
- /* need 12 or 17 (when verbose_listing is TRUE) column spaces */
- static void
- print_stamp (t)
- time_t t;
- {
- static boolean got_now = FALSE;
- static time_t now;
- static unsigned int threshold;
- static char t_month[12*3+1] = "JanFebMarAprMayJunJulAugSepOctNovDec";
- struct tm *p;
-
- if (t == 0)
- {
- printf (" "); /* 12 spaces */
- return;
- }
-
- if (!got_now)
- {
- now = time ((time_t*)0);
- p = localtime (&now);
- threshold = p->tm_year * 12 + p->tm_mon - 6;
- got_now = TRUE;
- }
-
- p = localtime (&t);
-
- if (p->tm_year * 12 + p->tm_mon > threshold)
- printf ("%.3s %2d %02d:%02d",
- &t_month[p->tm_mon * 3], p->tm_mday, p->tm_hour, p->tm_min);
- else
- printf ("%.3s %2d %04d",
- &t_month[p->tm_mon * 3], p->tm_mday, p->tm_year + 1900);
- }
-
- static void
- print_bar ()
- {
- char *p, *q;
- /* 17+1+(0 or 7+1)+7+1+6+1+(0 or 1+4)+(12 or 17)+1+20 */
- /* 12345678901234567_ 1234567_123456 _123456789012 1234 */
-
- if (verbose_listing)
- {
- p = "- ------ ---------- ";
- q = " -------------";
- }
- else
- {
- p = " ";
- q = " --------------------";
- }
-
- if (verbose)
- q = "";
-
- printf ("----------------- ------- ------%s------------%s\n", p, q);
- }
-
-
- /*----------------------------------------------------------------------*/
- /* */
- /*----------------------------------------------------------------------*/
-
- static void
- list_header ()
- {
- char *p, *q;
-
- if (verbose_listing)
- {
- p = "PACKED SIZE RATIO CRC ";
- q = " NAME";
- }
- else
- {
- p = " SIZE RATIO";
- q = " NAME";
- }
-
- if (verbose)
- q = "";
-
- printf (" PERMSSN UID GID %s STAMP%s\n", p, q);
- #if 0
- printf (" PERMSSN UID GID %s SIZE RATIO%s %s STAMP%s%s\n",
- verbose_listing ? " PACKED " : "", /* 8,0 */
- verbose_listing ? " CRC" : "", /* 5,0 */
- verbose_listing ? " " : "", /* 2,0 */
- verbose_listing ? " " : " ", /* 6,3 */
- verbose ? "" : " NAME");
- #endif
- print_bar ();
- }
-
- static void
- list_one (hdr)
- register LzHeader *hdr;
- {
- register int mode;
- register char *p;
- char method[6];
- char modebits[10];
-
- if (verbose)
- printf ("%s\n", hdr->name);
-
- strncpy(method,hdr->method,5);
- method[5]='\0';
-
- switch ( mode=hdr->extend_type )
- {
- case EXTEND_UNIX:
- mode=hdr->unix_mode;
- modebits[0]=((mode & UNIX_OWNER_READ_PERM) ? 'r' : '-');
- modebits[1]=((mode & UNIX_OWNER_WRITE_PERM) ? 'w' : '-');
- if (mode & UNIX_SETUID)
- modebits[2]='s';
- else
- modebits[2]=((mode & UNIX_OWNER_EXEC_PERM) ? 'x' : '-');
- modebits[3]=((mode & UNIX_GROUP_READ_PERM) ? 'r' : '-');
- modebits[4]=((mode & UNIX_GROUP_WRITE_PERM) ? 'w' : '-');
- if (mode & UNIX_SETGID)
- modebits[5]='s';
- else
- modebits[5]=((mode & UNIX_GROUP_EXEC_PERM) ? 'x' : '-');
- modebits[6]=((mode & UNIX_OTHER_READ_PERM) ? 'r' : '-');
- modebits[7]=((mode & UNIX_OTHER_WRITE_PERM) ? 'w' : '-');
- if (mode & UNIX_STYCKYBIT) /* STICKYBIT */
- modebits[8]='t';
- else
- modebits[8]=((mode & UNIX_OTHER_EXEC_PERM) ? 'x' : '-');
- modebits[9]='\0';
- printf ("%s%4d/%-4d", modebits, hdr->unix_uid, hdr->unix_gid);
- break;
- case EXTEND_OS68K:
- /**/ case EXTEND_XOSK: /**/
- mode=hdr->unix_mode;
- printf ("%c%c%c%c%c%c%c%c %4d/%-4d",
- ((mode & OSK_DIRECTORY_PERM) ? 'd' : '-'),
- ((mode & OSK_SHARED_PERM) ? 's' : '-'),
- ((mode & OSK_OTHER_EXEC_PERM) ? 'e' : '-'),
- ((mode & OSK_OTHER_WRITE_PERM)? 'w' : '-'),
- ((mode & OSK_OTHER_READ_PERM) ? 'r' : '-'),
- ((mode & OSK_OWNER_EXEC_PERM) ? 'e' : '-'),
- ((mode & OSK_OWNER_WRITE_PERM)? 'w' : '-'),
- ((mode & OSK_OWNER_READ_PERM) ? 'r' : '-'),
- hdr->unix_uid, hdr->unix_gid);
- break;
- default:
- switch (hdr->extend_type)
- { /* max 18 characters */
- case EXTEND_GENERIC:p = "[generic]"; break;
- case EXTEND_CPM: p = "[CP/M]"; break;
- case EXTEND_FLEX: p = "[FLEX]"; break;
- case EXTEND_OS9: p = "[OS-9]"; break;
- case EXTEND_OS68K: p = "[OS-9/68K]"; break;
- case EXTEND_MSDOS: p = "[MS-DOS]"; break;
- case EXTEND_MACOS: p = "[Mac OS]"; break;
- case EXTEND_OS2: p = "[OS/2]"; break;
- case EXTEND_HUMAN: p = "[Human68K]"; break;
- case EXTEND_OS386: p = "[OS-386]"; break;
- case EXTEND_RUNSER: p = "[Runser]"; break;
- #ifdef EXTEND_TOWNSOS
- /* This ID isn't fixed */
- case EXTEND_TOWNSOS: p = "[TownsOS]"; break;
- #endif
- /* Ouch! Please customize it's ID. */
- default: p = "[unknown]"; break;
- }
- printf ("%-18.18s", p);
- break;
- }
-
- print_size (hdr->packed_size, hdr->original_size);
-
- if (verbose_listing)
- if (hdr->has_crc)
- printf (" %s %04x", method,hdr->crc);
- else
- printf (" %s ****",method);
-
- printf (" ");
- print_stamp (hdr->unix_last_modified_stamp);
-
- if (!verbose)
- printf (" %s", hdr->name);
-
- printf ("\n");
- }
-
- static void
- list_tailer ()
- {
- struct stat stbuf;
-
- print_bar ();
-
- printf (" Total %4d file%c ",
- list_files, (list_files == 1) ? ' ' : 's');
- print_size (packed_size_total, original_size_total);
- printf (" ");
-
- if (verbose_listing)
- printf (" ");
-
- if (stat (archive_name, &stbuf) < 0)
- print_stamp ((time_t)0);
- else
- print_stamp (stbuf.st_mtime);
-
- printf ("\n");
- }
-
- /*----------------------------------------------------------------------*/
- /* LIST COMMAND MAIN */
- /*----------------------------------------------------------------------*/
-
- void
- cmd_list ()
- {
- FILE *afp;
- LzHeader hdr;
- int i;
-
- /* initialize total count */
- packed_size_total = 0L;
- original_size_total = 0L;
- list_files = 0;
-
- /* open archive file */
- if ((afp = open_old_archive ()) == NULL)
- fatal_error (archive_name);
- if (archive_is_msdos_sfx1 (archive_name))
- skip_msdos_sfx1_code (afp);
-
- /* print header message */
- if (!quiet)
- list_header ();
-
- /* print each file information */
- while (get_header (afp, &hdr))
- {
- if (need_file (hdr.name))
- {
- list_one (&hdr);
- list_files ++;
- packed_size_total += hdr.packed_size;
- original_size_total += hdr.original_size;
- }
-
- if (afp != stdin)
- fseek (afp, hdr.packed_size, SEEK_CUR);
- else
- {
- i = hdr.packed_size;
- while(i--) fgetc(afp);
- }
- }
-
- /* close archive file */
- fclose (afp);
-
- /* print tailer message */
- if (!quiet)
- list_tailer ();
-
- return;
- }
-
-
-
-
-